package ar.edu.utn.frba.dds.tp.segundaEntrega.code;


import java.util.ArrayList;
import java.util.List;
import java.math.BigDecimal;

import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;

public class Vuelo {
	
	private List<AsientoDeVuelo> asientos =  new ArrayList<AsientoDeVuelo>();
	private Aerolinea aerolinea;
	
	
	public Aerolinea getAerolinea() {
		return aerolinea;
	}


	private String nroDeVuelo;
		
	
	public Vuelo(String nroVuelo) {
		this.setNroDeVuelo(nroVuelo);
	}



	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((getNroDeVuelo() == null) ? 0 : getNroDeVuelo().hashCode());
		return result;
	}



	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Vuelo other = (Vuelo) obj;
		if (getNroDeVuelo() == null) {
			if (other.getNroDeVuelo() != null)
				return false;
		} else if (!getNroDeVuelo().equals(other.getNroDeVuelo()))
			return false;
		return true;
	}



	public BigDecimal getPrecioAsiento(AsientoDeVuelo asiento){
		
		return asiento.getPrecio().add(asiento.getPrecio().multiply(aerolinea.getImpuesto()));
		
	}
	
	public void agregarAsiento(AsientoDeVuelo asiento){
		asientos.add(asiento);
		
	}
	
	public void setAsientos(List<AsientoDeVuelo> asientos) {
		this.asientos = asientos;
	}
	
	public void setAerolinea(Aerolinea aero){
		this.aerolinea = aero;
	}
	
	public List<AsientoDeVuelo> getAsientos(){
		return this.asientos;
	}
	
	
	public String getNroDeVuelo() {
		return nroDeVuelo;
	}



	public void setNroDeVuelo(String nroDeVuelo) {
		this.nroDeVuelo = nroDeVuelo;
	}
	
	public static Predicate<AsientoDeVuelo> estaEnLaUbicacion(final String ubicacion) {
		Predicate<AsientoDeVuelo> predicadoUbicacion = new Predicate<AsientoDeVuelo>() {
			public boolean apply(AsientoDeVuelo asiento) {
				return asiento.getUbicacion().equals(ubicacion);
			}
		};
		return predicadoUbicacion;
	}
	
	public Vuelo filtrarAsientoPorUbicacion(String ubicacion) {
		List<AsientoDeVuelo> asientos = Lists.newArrayList(Collections2.filter(this.getAsientos(), Vuelo.estaEnLaUbicacion(ubicacion)));
		this.setAsientos(asientos);
		return this;
	}
	
	public static Predicate<AsientoDeVuelo> estaEnLaClase(final String clase) {
		Predicate<AsientoDeVuelo> predicadoClase = new Predicate<AsientoDeVuelo>() {
			public boolean apply(AsientoDeVuelo asiento) {
				return  asiento.getClase().equals(clase);
			}
		};
		return predicadoClase;
	}

	public Vuelo filtrarAsientoPorClase(String clase) {
		List<AsientoDeVuelo> asientos = Lists.newArrayList(Collections2.filter(this.getAsientos(), Vuelo.estaEnLaClase(clase)));
		this.setAsientos(asientos);
		return this;
	}

	
	public Vuelo filtrarAsientosSuperOferta(){
		List<AsientoDeVuelo> asientos = Lists.newArrayList(Collections2.filter(this.getAsientos(), Vuelo.asientoEsSuperOferta()));
		this.setAsientos(asientos);
		return this;
	}
	
	public static Predicate<AsientoDeVuelo> asientoEsSuperOferta() {
		Predicate<AsientoDeVuelo> predicadoSuperOferta = new Predicate<AsientoDeVuelo>() {
			public boolean apply(AsientoDeVuelo asiento) {
				return (!asiento.soySuperOferta(asiento.getVuelo().getAerolinea().getImpuesto()));
			}
		};
		return predicadoSuperOferta;
	}



	public void mostrarPreciosAsientos(Usuario usuario) {
		for(AsientoDeVuelo asiento : this.getAsientos()) {
			System.out.println("	Asiento numero:"+asiento.getNumero()+" precio: "+usuario.getPrecioAsiento(asiento));
		}
	}
}
	
	

